<?
/**
 * 
 * GPFHelper 클래스 : 헬퍼 함수 관리
 *
 * @author	chongmyung.park (http://byfun.com)
 */

if (!defined("GPF")) exit; // 개별 페이지 접근 불가 

include_once GPF_PATH."/lib/gpf.Config.class.php";
include_once GPF_PATH."/lib/gpf.PluginHelper.class.php";

class GPFHelper extends GPFObject
{
	/**
	 *
	 * @var 싱글톤 인스턴스
	 */
	protected static $instance = NULL;

	/**
	 * 생성자
	 */
	protected function __construct() 
	{
		 parent::__construct('helper');
	}

	/**
	 * Singleton
	 */
	public static function getInstance() {
		if(!isset(self::$instance)) {
			self::$instance = new GPFHelper();
		}
		return self::$instance;
	}

	/**
	 *
	 * 헬퍼 추가 함수
	 *
	 * @param string $name 사용할 함수명
	 * @param obj $obj {@link GPFPluginHelper} 객체
	 * @param string $help_function 헬퍼 객체의 실제 함수
	 */
	public function addHelper($name, $obj, $help_function)
	{
		if(!is_a($obj, "GPFHelperPlugin")) gpf_die("GPFHelper 에는 GPFHelperPlugin 클래스를 상속한 인스턴스만 사용가능합니다.");
		if(method_exists($this, $name)) gpf_die("GPFHelper 내의 멤버함수와 같은 이름으로 등록할 수 없습니다. (함수명 : $name)");
		if(isset($this->plugins[$name])) gpf_die("GPFHelper 에 이미 등록된 헬프함수가 존재합니다 (함수명 : $name)");
		$this->plugins[$name] = array('obj'=>$obj, 'func'=>$help_function);
		return true;
	}

	/**
	 *
	 * 동적 호출
	 */
	public function __call($method, $args)
	{
        if(method_exists($this, $method)) call_user_func_array(array($this, $method), $args);		
		$h = $this->plugins[$method];		
		if(is_array($h)) return call_user_func_array(array($h['obj'],$h['func']), $args);		
		echo("GPFHelper 에 등록되지 않은 메소드를 호출하였습니다 : '$method'");
	}	
}
?>